#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time   : 2021/6/23 21:50
# @Author : cjw
import os
import time
import shutil
import pytest
from selenium.webdriver import Chrome, ChromeOptions

from web_wework.util.file_operator import YmlOperator
from web_wework.setting import RESULT_PATH, REPORT_PATH, LOG_PATH, WORK_WEI_XIN_URL, COOKIES_YML


class RunCase:
	now_time = time.strftime('%Y_%m_%d_%H_%M_%S')  # 格式化的当前时间
	allure_result = os.path.join(RESULT_PATH, now_time)  # 结果目录
	allure_report = os.path.join(REPORT_PATH, now_time)  # 报告目录
	log_file = os.path.join(LOG_PATH, 'case.log')  # 日志文件

	@classmethod
	def run(cls, is_result_report_clean: bool = False, clean_result: bool = False,
	        clean_report: bool = False, is_auto_open_report: bool = True,
	        host: str = '127.0.0.1', port: int = 8889):
		"""
		案例执行
		1、只有一个result和report目录的情况下，需要同时清空目录内容，再生成结果和报告
		2、根据时间在result和report目录下生成时间目录，则不需要清空目录内容，在新目录下生成结果和报告
		:param is_result_report_clean: 是否清空allure用例执行结果收集目录和报告目录数据
		:param clean_result: 删除result目录所有文件
		:param clean_report: 删除report目录所有文件
		:param is_auto_open_report: 是否自动启动allure测试报告
		:param host: 启动ip
		:param port: 启动端口
		:return:
		"""
		# 删除result目录文件
		if clean_result:
			shutil.rmtree(RESULT_PATH)
			os.mkdir(RESULT_PATH)

		# 收集测试结果，生成报告, 启动报告
		if is_result_report_clean:
			# 清空allure收集的用例执行结果数据和生成的测试报告
			pytest.main(['--alluredir', RESULT_PATH, '--clean-alluredir', '--log-file', cls.log_file])
			cls.generate_report(is_result_report_clean, clean_report)

			# 启动报告
			cls.open_report(RESULT_PATH, is_auto_open_report, host, port)
		else:
			# 根据时间创建新的文件夹，在新的文件夹中生成allure收集的用例执行结果数据并生成测试报告
			pytest.main(['--alluredir', cls.allure_result, '--log-file', cls.log_file])
			cls.generate_report(is_result_report_clean, clean_report)

			# 启动报告
			cls.open_report(cls.allure_result, is_auto_open_report, host, port)

	@classmethod
	def generate_report(cls, is_clean: bool = False, clean_report: bool = False):
		"""
		打开或者生成测试报告
		:param is_clean: 是清空测试报告记录
		:param clean_report: 是否清空测试报告目录
		:return:
		"""
		# 删除报告目录并重新创建
		if clean_report:
			shutil.rmtree(REPORT_PATH)
			os.mkdir(REPORT_PATH)

		# 生成测试报告
		if is_clean:
			# 清空报告目录的数据，然后生成报告
			command = f'allure generate {RESULT_PATH} -o {REPORT_PATH} --clean'
		else:
			# 根据时间创建新的文件夹，在新的文件夹生成报告
			command = f'allure generate {cls.allure_result} -o {cls.allure_report}'
		os.popen(command)

	@classmethod
	def open_report(cls, path: str, is_auto: bool = True, host: str = '127.0.0.1',
	                port: int = 8889):
		"""
		打开测试报告，如果是自动打开测试报告，传入的是result路径，否则传入report路径
		:param path: 结果或者报告的路径
		:param is_auto: 是否自动打开
		:param host: 启动ip
		:param port: 启动端口
		:return:
		"""
		if is_auto:
			# 使用默认浏览器自动打开测试报告，在线查看报告
			command = f'allure serve {path}'
		else:
			# 生成访问测试报告的服务
			command = f'allure open -h {host} -p {port} {path}'
		os.popen(command)

	@classmethod
	def get_cookies(cls):
		"""
		获取cookies数据并保存
		复用浏览器前，先启动浏览器命令(windows)：
		chrome --remote-debugging-port=9222
		"""
		# 复用浏览器参数配置
		opt = ChromeOptions()
		opt.debugger_address = '127.0.0.1:9222'
		driver = Chrome(options=opt)

		try:
			driver.implicitly_wait(5)
			driver.get(WORK_WEI_XIN_URL)
			driver.find_element_by_id('menu_contacts').click()
			YmlOperator(COOKIES_YML).write(driver.get_cookies())
		finally:
			driver.quit()


if __name__ == '__main__':
	# RunCase.get_cookies()
	RunCase.run()